home *** CD-ROM | disk | FTP | other *** search
/ PC World 2008 February / PCWorld_2008-02_cd.bin / audio-video / reaper / reaper2028-install.exe / Effects / Till / Transient-driven Auto-Pan v1.1 (Master) < prev    next >
Text File  |  2007-12-03  |  7KB  |  313 lines

  1. // written by Till
  2. //
  3. // note: the effect sends data to regx. x is specified by the "send pan data to" slider
  4. //
  5. // note: the lookahead must be compensated manually in REAPER versions < 2
  6. //
  7. //
  8. //
  9. desc: Transient-driven Auto-Pan (Master)
  10. slider1:0<0,2,1{Stereo,Left,Right}>Input
  11. slider2:3<0,3,1{Left to Right,Right to Left,Bounce,Random (Ignores Pan/Random step size)}>Pan Mode
  12. slider3:10<0,100,1>Pan step size (%)
  13. slider4:0<0,100,1>Random step size (% +/-)
  14. slider5:100<1,100,1>Max. Pan
  15. slider6:20<0,1000,1>Fade time (ms)
  16. slider7:0<0,10,1>Sloppiness (Master-only)
  17. slider8:250<20,500,1>Min. pause between Pans (ms)
  18. slider9:0<0,10,1>Max Delay (ms)
  19. slider11:0<0,5,1{Left+Right,Left,Right,Sidechain Left+Right,Sidechain Left,Sidechain Right}>Director
  20. slider12:0<0,1,1{No,Yes}>Preview Director
  21. slider13:5<0,10,.1>Sensitivity
  22. slider14:0<0,100,1>Look-ahead (ms)
  23. slider15:0<0,10,1{Off,reg00,reg01,reg02,reg03,reg04,reg05,reg06,reg07,reg08,reg09}>Send Pan data to
  24. slider16:0<-100,100,1>Current Pan
  25.  
  26.  
  27. /////////////////
  28. ///           ///
  29. ///  I N I T  ///
  30. ///           ///
  31. /////////////////
  32.  
  33. @init
  34.  
  35.     log2 = log(2);
  36.     sqrt2 = sqrt(2);
  37.  
  38.     curgain = 1;
  39.     curgaindb = 0;
  40.     splsincelastpan = 0;
  41.     now = 0;
  42.     curpan = 0;
  43.     sloppypan = 0;
  44.     targetpan = 0;
  45.     lastpan = 0;
  46.     forth = 1;
  47.  
  48.     maxdelay = ceil((10 + 100) / 1000 * srate);
  49.  
  50.     delaybufferl = 0;
  51.     delaybufferr = 2 * maxdelay;
  52.  
  53.     delaypointer = 0;
  54.  
  55.     rmswindow = 50 / 1000 * srate;
  56.     rmsbuffer = 4 * maxdelay;
  57.  
  58.     rmssum = 0;
  59.     rmsp = 0;
  60.  
  61.     pdc_bot_ch = 0;
  62.     pdc_top_ch = 2;
  63.  
  64. /////////////////
  65. ///           ///
  66. ///  SLIDER   ///
  67. ///           ///
  68. /////////////////
  69.  
  70. @slider
  71.  
  72.     // SLIDER VALUES
  73.  
  74.     input = slider1;
  75.  
  76.     mode = slider2;
  77.  
  78.     stepsize = slider3;
  79.     randomstepsize = slider4;
  80.  
  81.     maxpan = slider5;
  82.  
  83.     fadetime = slider6 / 1000 * srate;
  84.     sloppiness = slider7;
  85.  
  86.     pause = slider8 / 1000 * srate;
  87.  
  88.     delay = slider9 / 1000 * srate;
  89.  
  90.     director = slider11;
  91.  
  92.     preview = slider12;
  93.     
  94.     sensitivity = slider13;
  95.  
  96.     lookahead = slider14 / 1000 * srate;
  97.  
  98.     sendto = slider15;
  99.  
  100.     attack = max(1, sqr(sensitivity) * 0.003 * srate);
  101.     release = max(1, pause / 2);
  102.  
  103.     tolerancedb = 12 - sensitivity;
  104.     tolerance = 2 ^ (tolerancedb / 6);
  105.  
  106.     minrms = 2 ^ (-5 - sensitivity / 2);
  107.  
  108.     pdc_delay = lookahead;
  109.  
  110. /////////////////
  111. ///           ///
  112. ///  SAMPLE   ///
  113. ///           ///
  114. /////////////////
  115.  
  116. @sample
  117.  
  118.     // choosing input
  119.  
  120.     input == 0 ? (
  121.         l = spl0;
  122.         r = spl1;
  123.     ) : input == 1 ? (
  124.         l = spl0;
  125.         r = spl0;
  126.     ) : input == 2 ? (
  127.         l = spl1;
  128.         r = spl1;
  129.     ) : 0;
  130.  
  131.     // buffering
  132.  
  133.     delaybufferl[delaypointer] = l;
  134.     delaybufferl[delaypointer + maxdelay] = l;
  135.     delaybufferr[delaypointer] = r;
  136.     delaybufferr[delaypointer + maxdelay] = r;
  137.  
  138.     // choosing director
  139.  
  140.     director == 0 ? (
  141.         dl = spl0;
  142.         dr = spl1;
  143.     ) : director == 1 ? (
  144.         dl = spl0;
  145.         dr = spl0;
  146.     ) : director == 2 ? (
  147.         dl = spl1;
  148.         dr = spl1;
  149.     ) : director == 3 ? (
  150.         dl = spl2;
  151.         dr = spl3;
  152.     ) : director == 4 ? (
  153.         dl = spl2;
  154.         dr = spl2;
  155.     ) : director == 5 ? (
  156.         dl = spl3;
  157.         dr = spl3;
  158.     ) : 0;
  159.  
  160.     cursample = (abs(dl) + abs(dr)) / 2;
  161.  
  162. // calcing rms power
  163.  
  164.     rmssum -= rmsbuffer[rmsp];
  165.  
  166.     rmssum += sqr(cursample);
  167.  
  168.     rmsbuffer[rmsp] = sqr(cursample);
  169.  
  170.     rms = max(sqrt(rmssum / rmswindow), minrms);
  171.  
  172.     rmsp+=1;
  173.     rmsp >= rmswindow && rmsp = 0;
  174.  
  175.     threshold = rms * 1.68;
  176.     thresholddb = 6 * log(threshold) / log2 + 3;
  177.  
  178. // detecting
  179.  
  180.     (cursample >= threshold) ? (
  181.         cursampledb = 6 * log(cursample) / log2;
  182.         targetgaindb = thresholddb - cursampledb;
  183.     ) : (
  184.         targetgaindb = 0;
  185.     );
  186.  
  187.     targetgaindb > curgaindb ? (
  188.         curgaindb += (targetgaindb - curgaindb) / release;
  189.     ) : (
  190.         curgaindb += (targetgaindb - curgaindb) / attack;
  191.     );
  192.  
  193.     curgain = exp((curgaindb / 6) * log2);
  194.  
  195.     detector = cursample * curgain;
  196.  
  197. // panning
  198.  
  199.     pop = 0;
  200.     now ? (
  201.         (splsincelastpan > pause) && now = 0;
  202.     ) : (
  203.         detector > threshold * tolerance && (
  204.             pop = 1;
  205.             now = 1;
  206.             splsincelastpan = 0;
  207.             lastpan = curpan;
  208.             mode == 0 ? (
  209.                 targetpan = curpan + stepsize + (rand(2) - 1) * randomstepsize;
  210.                 targetpan < -maxpan && (targetpan += 2 * maxpan);
  211.                 targetpan > maxpan && (targetpan -= 2 * maxpan);
  212.             ) : mode == 1 ? (
  213.                 targetpan = curpan - stepsize - (rand(2) - 1) * randomstepsize;
  214.                 targetpan > maxpan && (targetpan -= 2 * maxpan);
  215.                 targetpan < -maxpan && (targetpan += 2 * maxpan);
  216.             ) : mode == 2 ? (
  217.                 forth ? (
  218.                     targetpan = curpan + stepsize + (rand(2) - 1) * randomstepsize;
  219.                 ) : (
  220.                     targetpan = curpan - stepsize - (rand(2) - 1) * randomstepsize;
  221.                 );
  222.                 targetpan > maxpan && (
  223.                     targetpan = 2 * maxpan - targetpan;
  224.                     forth = 0;
  225.                 );
  226.                 targetpan < -maxpan && (
  227.                     targetpan = - 2* maxpan - targetpan;
  228.                     forth = 1;
  229.                 );
  230.             ) : (
  231.                 targetpan = ceil((rand(2) - 1) * maxpan);
  232.             );
  233.         );
  234.     );
  235.  
  236.     splsincelastpan += 1;
  237.  
  238. //fading the pan
  239.  
  240.     curpan != targetpan && (
  241.         fadepos = splsincelastpan / fadetime;
  242.         fadepos = (-cos(min(fadepos, 1) * $pi) + 1) / 2;
  243.         curpan = lastpan + (targetpan - lastpan) * fadepos;
  244.     );
  245.  
  246. // sending pan info
  247.  
  248.     sendto > 0 && (
  249.         sendto == 1 ? (
  250.             reg00 = curpan;
  251.         ) : sendto == 2 ? (
  252.             reg01 = curpan;
  253.         ) : sendto == 3 ? (
  254.             reg02 = curpan;
  255.         ) : sendto == 4 ? (
  256.             reg03 = curpan;
  257.         ) : sendto == 5 ? (
  258.             reg04 = curpan;
  259.         ) : sendto == 6 ? (
  260.             reg05 = curpan;
  261.         ) : sendto == 7 ? (
  262.             reg06 = curpan;
  263.         ) : sendto == 8 ? (
  264.             reg07 = curpan;
  265.         ) : sendto == 9 ? (
  266.             reg08 = curpan;
  267.         ) : sendto == 10 ? (
  268.             reg09 = curpan;
  269.         ) : 0;
  270.     );
  271.  
  272. // sloppiness
  273.  
  274.     s = sloppiness * sloppiness * sloppiness * sloppiness;
  275.     sloppypan = (curpan + s * sloppypan) / (s + 1);
  276.  
  277. // calculating the actual volumes
  278.  
  279.     abspan = abs(sloppypan);
  280.     dominantpandb = 6 * abspan / 100;
  281.     dominantpan = exp((dominantpandb / 6) * log2);
  282.     recessivepan = 2 - dominantpan;
  283.  
  284. // leveling
  285.  
  286.     sloppypan > 0 ? (
  287.         r = dominantpan * delaybufferr[maxdelay + delaypointer - lookahead];
  288.         x = abspan / 100 * delay;
  289.         f = x - floor(x);
  290.         c = floor(x + 1) - x;
  291.         l = recessivepan * (c * delaybufferl[maxdelay + delaypointer - floor(abspan / 100 * delay) - lookahead] + f * delaybufferl[maxdelay + delaypointer - ceil(abspan / 100 * delay) - lookahead]);
  292.     ) : (
  293.         l = dominantpan * delaybufferl[maxdelay + delaypointer - lookahead];
  294.         x = abspan / 100 * delay;
  295.         f = x - floor(x);
  296.         c = floor(x + 1) - x;
  297.         r = recessivepan * (c * delaybufferr[maxdelay + delaypointer - floor(abspan / 100 * delay) - lookahead] + f * delaybufferr[maxdelay + delaypointer - ceil(abspan / 100 * delay) - lookahead]);
  298.     );
  299.     
  300. // outputting
  301.  
  302.     preview ? (
  303.         spl0 = dl;
  304.         spl1 = pop;
  305.     ) : (
  306.         spl0 = l;
  307.         spl1 = r;
  308.     );
  309.  
  310.     slider16 = curpan;
  311.  
  312.     delaypointer += 1;
  313.     delaypointer >= maxdelay && (delaypointer = 0);